home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / source / framework / ISupEvents.mod < prev    next >
Text File  |  1995-06-29  |  5KB  |  163 lines

  1. (*************************************************************************
  2.  
  3.      $RCSfile: ISupEvents.mod $
  4.   Description: Extends the classes defined in Module Events to provide
  5.                the event management required by the IntuiSup library,
  6.                written as an alternative to GadTools library by Torsten
  7.                Jürgeleit.
  8.  
  9.    Created by: fjc (Frank Copeland)
  10.     $Revision: 1.12 $
  11.       $Author: fjc $
  12.         $Date: 1995/06/29 18:51:33 $
  13.  
  14.   Copyright © 1994-1995, Frank Copeland.
  15.   This file is part of the Oberon-A Library.
  16.   See Oberon-A.doc for conditions of use and distribution.
  17.   ________________________________________________________________________
  18.  
  19.   The IntuiSup library was created as an alternative to Commodore's
  20.   GadTools library. It provides almost identical facilities (plus a few
  21.   extra ones, such as a form of locale support), but unlike GadTools it
  22.   will work under Kickstart 1.3.
  23.  
  24.   Like GadTools, IntuiSup requires programmers to replace calls to
  25.   Exec's GetMsg() and ReplyMsg() functions with calls to its own
  26.   functions.  Unlike GadTools, IntuiSup in some cases sends the Task a
  27.   special form of IntuiMessage which must be interpreted differently to
  28.   an ordinary IntuiMessage. Special IntuiSup messages are identified by
  29.   the string "ISUP" in the Class field and the other fields of the
  30.   message have their meanings altered.
  31.  
  32.   The ISupPort class is an extension of the IdcmpPort class which
  33.   overrides the methods that rely on the Exec functions and replaces
  34.   them with methods that use the IntuiSup functions.  It also adds a new
  35.   method to deal with the specially formatted IntuiSup messages.
  36.  
  37.   IntuiSup also provides a RequesterData structure which can be used to
  38.   create requesters that make full use of the facilities of IntuiSup
  39.   library.  The ISupDialog class is an extension of the RequesterData
  40.   type that associates it with an ISupPort object.  The ISupPort object
  41.   is responsible for user interaction with the requester.
  42.  
  43. *************************************************************************)
  44.  
  45. <*  STANDARD- *>
  46. <*$ NilChk-  *>
  47.  
  48. (*
  49.   NIL checking is turned off and replaced with ASSERTs at the appropriate
  50.   places.
  51. *)
  52.  
  53. MODULE ISupEvents;
  54.  
  55. IMPORT
  56.   SYS := SYSTEM, e := Exec, i := Intuition, is := IntuiSup, ev := Events,
  57.   Errors, s := Sets;
  58.  
  59. TYPE
  60.  
  61.   ISupPort *= POINTER TO ISupPortRec;
  62.   ISupPortRec *= RECORD (ev.IdcmpPortRec) END;
  63.  
  64. TYPE
  65.  
  66.   ISupDialog *= POINTER TO ISupDialogRec;
  67.   ISupDialogRec *= RECORD
  68.     reqData  *: is.RequesterData;
  69.     iSupPort *: ISupPort;
  70.   END;
  71.  
  72.  
  73. (*-----------------------------------*)
  74. PROCEDURE (isp : ISupPort) HandleSig * () : INTEGER;
  75.  
  76.   VAR result : INTEGER; msg : i.IntuiMessagePtr;
  77.  
  78. BEGIN (* HandleSig *)
  79.   result := ev.Pass; (* Default *)
  80.   ASSERT (isp.port # NIL, Errors.preCondition);
  81.   LOOP
  82.     msg := is.GetMsg (isp.port);
  83.     IF msg = NIL THEN EXIT END;
  84.     result := isp.HandleMsg (SYS.VAL (e.MessagePtr, msg));
  85.     IF result = ev.Pass THEN is.ReplyMsg (msg) END;
  86.     IF result > ev.Continue THEN EXIT END
  87.   END;
  88.   RETURN result
  89. END HandleSig;
  90.  
  91.  
  92. (*-----------------------------------*)
  93. PROCEDURE (isp : ISupPort) HandleISup* (msg : i.IntuiMessagePtr) : INTEGER;
  94.  
  95. BEGIN (* HandleISup *)
  96.   HALT (Errors.notImplemented);
  97.   RETURN ev.StopAll
  98. END HandleISup;
  99.  
  100.  
  101. (*-----------------------------------*)
  102. PROCEDURE (isp : ISupPort) HandleMsg* ( msg : e.MessagePtr ) : INTEGER;
  103.  
  104.   VAR
  105.     intuiMessage : i.IntuiMessagePtr;
  106.  
  107. BEGIN (* HandleMsg *)
  108.   intuiMessage := SYS.VAL (i.IntuiMessagePtr, msg);
  109.   IF intuiMessage.class = SYS.VAL (SET, is.id) THEN
  110.     RETURN isp.HandleISup (intuiMessage)
  111.   ELSE
  112.     RETURN isp.HandleMsg^ (msg)
  113.   END
  114. END HandleMsg;
  115.  
  116.  
  117. (*-----------------------------------*)
  118. PROCEDURE (isp : ISupPort) FlushPort * ();
  119.  
  120.   VAR msg : i.IntuiMessagePtr;
  121.  
  122. BEGIN (* FlushPort *)
  123.   ASSERT (isp.port # NIL, Errors.preCondition);
  124.   e.Forbid ();
  125.     LOOP
  126.       msg := is.GetMsg (isp.port);
  127.       IF msg = NIL THEN EXIT END;
  128.       is.ReplyMsg (msg)
  129.     END;
  130.   e.Permit ()
  131. END FlushPort;
  132.  
  133.  
  134. (*-----------------------------------*)
  135. PROCEDURE Activate*
  136.   ( isd    : ISupDialog;
  137.     window : i.WindowPtr )
  138.   : BOOLEAN;
  139.  
  140.   VAR
  141.     savedIDCMP : s.SET32; rList : is.RequesterListPtr; iSupPort : ISupPort;
  142.     reqWin : i.WindowPtr;
  143.  
  144. BEGIN (* Activate *)
  145.   rList := is.DisplayRequester (window, isd.reqData, NIL);
  146.   IF rList # NIL THEN
  147.     savedIDCMP := window.idcmpFlags;
  148.     iSupPort := isd.iSupPort;
  149.     reqWin := rList.reqWindow;
  150.     iSupPort.AttachPort (reqWin.userPort);
  151.     iSupPort.SetupWindow (reqWin);
  152.     ev.SimpleLoop (iSupPort, ev.NoGC);
  153.     iSupPort.CleanupWindow (reqWin);
  154.     iSupPort.DetachPort();
  155.     is.RemoveRequester (rList);
  156.     i.OldModifyIDCMP (window, savedIDCMP);
  157.     RETURN TRUE
  158.   END;
  159.   RETURN FALSE
  160. END Activate;
  161.  
  162. END ISupEvents.
  163.